package com.huatai.datacenter.utils;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

import java.util.Map;

/**
 * @description d断言：断言某些对象或值是否符合规定，否则抛出异常，经常用于做变量检查
 * @author Lion
 * @date 2023/7/10  15:04
 */
public class AssertI extends Assert {

	/**
	 * 断言对象是否为{@code 手机号} ，如果不为{@code 手机号} 抛出{@link IllegalArgumentException} 异常
	 *
	 * <pre class="buildCode">
	 * Assert.isMobile(value, "The value must be mobile");
	 * </pre>
	 *
	 * @param object           被检查的对象
	 * @param errorMsgTemplate 消息模板，变量使用{}表示
	 * @param params           参数列表
	 * @throws IllegalArgumentException if the object is not {@code mobile}
	 */
	public static void isMobile(Object object, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
		if (StrUtil.isBlank(errorMsgTemplate)) {
			errorMsgTemplate = "手机格式错误";
		}
		if (object == null || !Validator.isMobile(object.toString())) {
			throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
		}
	}

	/**
	 * 是否是数字
	 * @param object
	 * @param errorMsgTemplate
	 * @param params
	 */
	public static void isNumber(Object object, String errorMsgTemplate, Object... params) {
		if (object == null || !Validator.isNumber(object.toString())) {
			throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
		}
	}

	/**
	 * 断言被检测的字典中，必须包含指定的key
	 *
	 * @param value            被检测字段
	 * @param key              key
	 * @param errorMsgTemplate
	 * @param params
	 */
	public static void containsKey(Map value, String key, String errorMsgTemplate, Object... params) {
		if (!value.containsKey(key)) {
			throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
		}
	}

	/**
	 * @param value            被检测字符串
	 * @param s                被测试是否包含的字符串
	 * @param errorMsgTemplate
	 * @param params
	 */
	public static void containsIgnoreCase(CharSequence value, CharSequence s, String errorMsgTemplate, Object... params) {
		if (!StrUtil.containsIgnoreCase(value, s)) {
			throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
		}
	}

	/**
	 * 断言对象不能为空
	 * 支持：
	 *
	 * <pre>
	 * 	 1. CharSequence
	 * 	 2. Map
	 * 	 3. Iterable
	 * 	 4. Iterator
	 * 	 5. Array
	 * 	 </pre>
	 *
	 * @param value            待检测的对象
	 * @param errorMsgTemplate
	 * @param params
	 * @return
	 */
	public static void notEmpty(Object value, String errorMsgTemplate, Object... params) {
		if (ObjectUtil.isEmpty(value)) {
			throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
		}
	}

	/**
	 * @param value  被检测字符串
	 * @param params
	 */
	public static void isStartWith(String value, String prefix, String errorMsgTemplate, Object... params) {
		if (value.indexOf(prefix) < 0) {
			throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
		}
	}
}
